package main

import (
	"fmt"
)

/**
执行用时：4 ms, 在所有 Go 提交中击败了61.08%的用户
内存消耗：2.6 MB, 在所有 Go 提交中击败了98.98%的用户
 */
func isValidSudoku(board [][]byte) bool {

	st := [9]bool{}

	// 判断行
	for i := 0; i < 9; i++ {
		for j := 0; j < 9; j++ { st[j] = false }
		for j := 0; j < 9; j++ {
			if board[i][j] != '.' {
				t := board[i][j] - '1'
				if st[t] { return false }
				st[t] = true
			}
		}
	}

	// 判断列
	for i := 0; i < 9; i++ {
		for j := 0; j < 9; j++ { st[j] = false }
		for j := 0; j < 9; j++ {
			if board[j][i] != '.' {
				t := board[j][i] - '1'
				if st[t] { return false }
				st[t] = true
			}
		}
	}

	// 判断九宫格
	for i := 0; i < 9; i += 3 {
		for j := 0; j < 9; j += 3 {
			for k := 0; k < 9; k++ { st[k] = false }
			for x := 0; x < 3; x++ {
				for y := 0; y < 3; y++ {
					if board[i + x][j + y] != '.' {
						t := board[i + x][j + y] - '1'
						if st[t] { return false }
						st[t] = true
					}
				}
			}
		}
	}
	return true
}

func main() {

	board := [][]byte {
		{'.', '9', '.', '.', '4', '.', '.', '.', '.'},
		{'1', '.', '.', '.', '.', '.', '6', '.', '.'},
		{'.', '.', '3', '.', '.', '.', '.', '.', '.'},
		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},
		{'.', '.', '.', '7', '.', '.', '.', '.', '.'},
		{'3', '.', '.', '.', '5', '.', '.', '.', '.'},
		{'.', '.', '7', '.', '.', '4', '.', '.', '.'},
		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},
		{'.', '.', '.', '.', '7', '.', '.', '.', '.'},
	}
	fmt.Println(isValidSudoku(board))  // true
}
